package com.xuxu.subscribe.plus;

import com.rabbitmq.client.*;
import com.xuxu.util.RabbitConnectionUtil;

import java.io.IOException;

/**
 * 发布者/订阅者模式  Publish/Subscribe
 * <p>
 * 订阅者模式的交换机类型是 fanout
 */
public class Consumer2_Plus {

    //定义交换机名称
    static final String FANOUT_EXCHANGE = "fanout_exchange";
    //定义队列一名称
    static final String FANOUT_QUEUE_2 = "fanout_queue_2";


    public static void main(String[] args) throws Exception {
        //获取连接对象
        Connection connection = RabbitConnectionUtil.getConnection();
        //创建频道对象
        Channel channel = connection.createChannel();

        //声明交换机
        /*
            参数一：交换机名称
            参数二：交换机类型
         */
        channel.exchangeDeclare(FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT);

        //声明队列一
        /*
            参数一：队列名称
            参数二：是否实例化队列
            参数二：是否独占本次连接
            参数二：是否在不使用的时候删除
            参数二：队列其他参数
         */
        channel.queueDeclare(FANOUT_QUEUE_2, true, false, false, null);

        //绑定交换机和队列一
        /*
            参数一：队列名称
            参数二：交换机名称
            参数三：路由key
         */
        channel.queueBind(FANOUT_QUEUE_2, FANOUT_EXCHANGE, "");

        //创建消费者
        DefaultConsumer consumer = new DefaultConsumer(channel) {

            /**
             * 重写消息处理方法
             * @param consumerTag 消费者标签，在channel.basicConsume时候可以指定
             * @param envelope  信封，包含消息id、交换机、路由key(routingKey)、
             * @param properties  属性信息
             * @param body  消息体
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //路由key
                System.out.println("路由key为:" + envelope.getRoutingKey());

                //交换机
                System.out.println("交换机为:" + envelope.getExchange());

                //消息id
                System.out.println("消息id为:" + envelope.getDeliveryTag());

                //收到的消息
                System.out.println("消费者2 ----- 收到的消息是:    " + new String(body, "utf-8"));

            }
        };

        //监听消息
        /*
            参数一：队列名称
            参数二：是否自动确认，设置为true为表示消息接收到自动向mq回复接收到了，mq接收到回复会删除消 息，设置为false则需要手动确认
            参数三：消费者对象，消息收到后回调
         */
        channel.basicConsume(FANOUT_QUEUE_2,true,consumer);

        //不用关闭资源，需要持续监听

    }
}
